﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using TCC_Hotel.Serviços.BDServices;
using TCC_Hotel.Entidades;
using TCC_Hotel.Serviços.OtherServices;

namespace TCC_Hotel.Apresentacao.Reservas
{
    public partial class EfetuarReservaHospedeFaturado : System.Web.UI.Page
    {
        ReservaService servico_reserva = new ReservaService();
        EmpresaService servico_empresa = new EmpresaService();
        List<Reserva_Particular> listaReservas_Particulares;
        List<Reserva_Faturada> listaReservas_Faturadas;
        List<DiaNomeReserva> listaDiasReservas;
        string data_Inicial, data_Final, apartamento;
        int numeroHospedes, numeroApartamento;

        /// <summary>
        /// Carregamento da página
        /// </summary>
        protected void Page_Load(object sender, EventArgs e)
        {
            //Recupera o usuario corrente
            string usuario = Request.ServerVariables["AUTH_USER"].ToString();
            LoginService servico_Login = new LoginService();
            //Verifica permissao ao acesso da página
            if (!servico_Login.RecuperarPermissaoCache(usuario).Reservas)
            {
                //Redireciona para a pagina inicial
                Response.Redirect("~/");
            }

            if (!IsPostBack)
            {
                //Se nao vier parametro, redireciona o usuario para a tela inicial
                if (Request.Params["dataInicial"] == null || Request.Params["dataFinal"] == null || Request.Params["numeroHospedes"] == null || Request.Params["apartamento"] == null)
                {
                    //Redireciona para a pagina inicial
                    Response.Redirect("~/");
                }

                //Recupera os parametros da URL
                data_Inicial = Request.Params["dataInicial"];
                data_Final = Request.Params["dataFinal"];
                numeroHospedes = Convert.ToInt32(Request.Params["numeroHospedes"]);
                apartamento = Request.Params["apartamento"];

                //Preenche os campos automaticamente com os parametros vindos da tela anterior
                txtDataFinal.Text = data_Final;
                txtDataInicio.Text = data_Inicial;
                txtApartamento.Text = apartamento;


                //limpa o chache existente para pegar os dados mais atualizados
                HttpContext.Current.Cache.Remove("Lista_Empresa_Autorizada");

                List<Empresa> listaEmpresa = servico_empresa.ListarEmpresasAutorizadasCache().OrderBy(i=>i.Nome).ToList();
                ddlEmpresa.DataSource = listaEmpresa;
                ddlEmpresa.DataTextField = "Nome";
                ddlEmpresa.DataValueField = "CNPJ";
                ddlEmpresa.DataBind();

                //Preenche as informçaões da primeira empresa do dropdown
                Empresa empresa = listaEmpresa.FirstOrDefault();
                txtCNPJReserva.Text = empresa.CNPJ;
                txtEmailReserva.Text = empresa.Contato.Email;
                txtTelefone.Text = empresa.Contato.Telefone[0];
            }
        }

        /// <summary>
        /// Evento de click do botão salvar
        /// </summary>
        protected void btnSalvar_Click(object sender, EventArgs e)
        {
            numeroApartamento = Convert.ToInt32(Request.Params["numeroApartamento"]);

            ComumServices comum = new ComumServices();

            //preenche a lista obrigatoria para verificar se todos os campos obrigatorios foram preenchidos
            List<string> listaObrigatoria = new List<string>() 
            { 
                txtNome1.Text.Trim(),
                txtRG1.Text                
                            
            };

            //verifica se algum campo obrigatorio nao foi preenchido
            if (!comum.ValidaCamposObrigatorios(listaObrigatoria))
            {
                MensagemJS("ERRO: Campo(s) obrigatório(s) em branco");
                return;
            }
            
            //Faz validação dos Rgs e nomes
            List<string> RGs = new List<string>();
            List<string> Nomes = new List<string>();

            Nomes.Add(txtNome2.Text);
            Nomes.Add(txtNome3.Text);
            Nomes.Add(txtNome4.Text);
            Nomes.Add(txtNome5.Text);

            RGs.Add(txtRG2.Text);
            RGs.Add(txtRG3.Text);
            RGs.Add(txtRG4.Text);
            RGs.Add(txtRG5.Text);


            if (!comum.ValidaNomesRG(RGs, Nomes))
            {
                MensagemJS("ERRO: Para cada RG digitado, deve-se preencher um nome");
                return;
            }


            //Faz validação dos RGs de reserva
            if (!comum.ValidaRG(txtRG1.Text) || !comum.ValidaRG(txtRG2.Text) || !comum.ValidaRG(txtRG3.Text) || !comum.ValidaRG(txtRG4.Text) || !comum.ValidaRG(txtRG5.Text))
            {
                MensagemJS("ERRO: RG(s) digitado(s) não é(são) válido(s)");
                return;
            }

            //recupera todas as reservas para verificar a disponibilidade do hotel
            listaReservas_Particulares = servico_reserva.RecuperarReservasParticularesApartamento(Convert.ToInt32(numeroApartamento));
            listaReservas_Faturadas = servico_reserva.RecuperarReservasFaturadasApartamento(Convert.ToInt32(numeroApartamento));
            listaDiasReservas = servico_reserva.ListarDiasReservas(listaReservas_Particulares, listaReservas_Faturadas);

            //Chama o serviço que valida o telefone
            if (!servico_reserva.VerificaDisponibilidade(txtDataInicio.Text, txtDataFinal.Text, listaDiasReservas))
            {
                MensagemJS("ERRO: Data indisponível no momento");
                return;
            }

            //monta o objeto reserva com os valores digitados do usuário
            try
            {
                Reserva_Faturada reserva = new Reserva_Faturada()
                {
                    CNPJ_Reserva = txtCNPJReserva.Text,
                    Email_Reserva = txtEmailReserva.Text,
                    Empresa_Reserva = Convert.ToString(ddlEmpresa.SelectedItem),
                    Telefone = txtTelefone.Text,
                    Nome_1 = txtNome1.Text,
                    RG_1 = txtRG1.Text,                    
                    Nome_2 = txtNome2.Text,
                    RG_2 = txtRG2.Text,
                    Nome_3 = txtNome3.Text,
                    RG_3 = txtRG3.Text,
                    Nome_4 = txtNome4.Text,
                    RG_4 = txtRG4.Text,
                    Nome_5 = txtNome5.Text,
                    RG_5 = txtRG5.Text,
                    Data_Inicio = Convert.ToDateTime(txtDataInicio.Text),
                    Data_Final = Convert.ToDateTime(txtDataFinal.Text),
                    Numero_Apartamento = numeroApartamento
                    
                };



                //chama o serviço que insere o funcionário no banco de dados
                if (servico_reserva.EfetuarReservaFaturada(reserva))
                {
                    MensagemJS("Reserva efetuada com sucesso!");
                    AposEfetuar();
                }
                else
                {
                    MensagemJS("ERRO: Ocorreu um erro!");
                    return;
                }

            }
            catch (Exception)
            {
                //se ocorrer exceção lanca mensagem para o usuário
                MensagemJS("ERRO: Campo(s) com valor(es) inválido(s)");
                return;

            }
         
        }

        /// <summary>
        /// Evento após completar o efetuar reserva
        /// </summary>
        public void AposEfetuar()
        {
            HttpContext.Current.Cache.Remove("Lista_Reserva_Particular");
            HttpContext.Current.Cache.Remove("Lista_Reserva_Faturada");
            txtNome1.Enabled = false;
            txtRG1.Enabled = false;            
            txtNome2.Enabled = false;
            txtRG2.Enabled = false;
            txtNome3.Enabled = false;
            txtRG3.Enabled = false;
            txtNome4.Enabled = false;
            txtRG4.Enabled = false;
            txtNome5.Enabled = false;
            txtRG5.Enabled = false;
            ddlEmpresa.Enabled = false;
            btnSalvar.Visible = false;
            btnLimpar.Visible = false;
            btnBuscaHospede1.Enabled = false;
            btnBuscaHospede2.Enabled = false;
            btnBuscaHospede3.Enabled = false;
            btnBuscaHospede4.Enabled = false;
            btnBuscaHospede5.Enabled = false;
        }

        /// <summary>
        /// Limpa todos os campos
        /// </summary>        
        protected void btnLimpar_Click(object sender, EventArgs e)
        {
            txtNome1.Text = null;
            txtRG1.Text = null;
            txtNome2.Text = null;
            txtRG2.Text = null;
            txtNome3.Text = null;
            txtRG3.Text = null;
            txtNome4.Text = null;
            txtRG4.Text = null;
            txtNome5.Text = null;
            txtRG5.Text = null;

        }

        /// <summary>
        /// Evento de troca do item do dropdown de empresas para aparecer as informçaões corretas desta
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void ddlEmpresa_SelectedIndexChanged(object sender, EventArgs e)
        {
            Empresa empresa = servico_empresa.ListarEmpresasAutorizadasCache().Where(i=>i.CNPJ == ddlEmpresa.SelectedValue).FirstOrDefault();
            txtCNPJReserva.Text = empresa.CNPJ;
            txtEmailReserva.Text = empresa.Contato.Email;
            txtTelefone.Text = empresa.Contato.Telefone[0];
        
        }

        /// <summary>
        /// Evento de click do botao voltar 
        /// </summary>
        protected void btnVoltar_Click(object sender, EventArgs e)
        {
            numeroHospedes = Convert.ToInt32(Request.Params["numeroHospedes"]);
            apartamento = Request.Params["apartamento"];
            Response.Redirect("~/Apresentacao/Reservas/MapaReservas.aspx?apartamentoCorrente=" + apartamento + "&numeroHospedeCorrente=" + numeroHospedes);
    
        }

        /// <summary>
        /// Evento de click para buscaar as informações do hóspede 
        /// </summary>
        protected void btnBuscaHospede1_Click(object sender, EventArgs e)
        {
            HospedeService servico_Hospede = new HospedeService();
            string RG = txtRG1.Text;

            //recupera o hospede cadastrado pelo RG
            HospedeFaturado hospede = servico_Hospede.RecuperarDetalhesHospedeFaturadoPorRG(RG);

            if (hospede != null)
            {
                txtNome1.Text = hospede.Nome;
            }
            else
            {
                MensagemJSClassico("RG não cadastrado!");

            }
        }

        /// <summary>
        /// Evento de click para buscaar as informações do hóspede 
        /// </summary>
        protected void btnBuscaHospede2_Click(object sender, EventArgs e)
        {
            HospedeService servico_Hospede = new HospedeService();
            string RG = txtRG2.Text;

            //recupera o hospede cadastrado pelo RG
            HospedeFaturado hospede = servico_Hospede.RecuperarDetalhesHospedeFaturadoPorRG(RG);

            if (hospede != null)
            {
                txtNome2.Text = hospede.Nome;
            }
            else
            {
                MensagemJSClassico("RG não cadastrado!");
            }
        }

        /// <summary>
        /// Evento de click para buscaar as informações do hóspede 
        /// </summary>
        protected void btnBuscaHospede3_Click(object sender, EventArgs e)
        {
            HospedeService servico_Hospede = new HospedeService();
            string RG = txtRG3.Text;

            //recupera o hospede cadastrado pelo RG
            HospedeFaturado hospede = servico_Hospede.RecuperarDetalhesHospedeFaturadoPorRG(RG);

            if (hospede != null)
            {
                txtNome3.Text = hospede.Nome;
            }
            else
            {
                MensagemJSClassico("RG não cadastrado!");
            }
        }

        /// <summary>
        /// Evento de click para buscaar as informações do hóspede 
        /// </summary>
        protected void btnBuscaHospede4_Click(object sender, EventArgs e)
        {
            HospedeService servico_Hospede = new HospedeService();
            string RG = txtRG4.Text;

            //recupera o hospede cadastrado pelo RG
            HospedeFaturado hospede = servico_Hospede.RecuperarDetalhesHospedeFaturadoPorRG(RG);

            if (hospede != null)
            {
                txtNome4.Text = hospede.Nome;
            }
            else
            {
                MensagemJSClassico("RG não cadastrado!");
            }
        }

        /// <summary>
        /// Evento de click para buscaar as informações do hóspede 
        /// </summary>
        protected void btnBuscaHospede5_Click(object sender, EventArgs e)
        {
            HospedeService servico_Hospede = new HospedeService();
            string RG = txtRG5.Text;

            //recupera o hospede cadastrado pelo RG
            HospedeFaturado hospede = servico_Hospede.RecuperarDetalhesHospedeFaturadoPorRG(RG);

            if (hospede != null)
            {
                txtNome5.Text = hospede.Nome;
            }
            else
            {
                MensagemJSClassico("RG não cadastrado!");
            }
        }

        /// <summary>
        /// Lança um popup em javaScript com alguma mensagem
        /// </summary>
        /// <param name="msg">Mensagem do popup</param>
        public void MensagemJS(string msg)
        {
            //Formata um alert para o usuário
            Page.ClientScript.RegisterStartupScript(

                     this.GetType(),

                     "error",

                     "$(window).load(function(){alert('" + msg + "')});",

                     true);

        }

        /// <summary>
        /// Lança um popup em javaScript classico com alguma mensagem
        /// </summary>
        /// <param name="msg">Mensagem do popup</param>
        public void MensagemJSClassico(string msg)
        {
            //Formata um alert para o usuário
            ScriptManager.RegisterStartupScript(this,

                    this.GetType(),

                    "Mensagem",

                    string.Format("alert" + "('" + msg + "')"),

                    true);

        }
    }
}